<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<title>Канал (групповой чат)</title>
<link href="ice.css" type="text/css" rel="stylesheet"/>
</head>
<body>
<p><b>Distributed Network Messaging Protocol</b></p>

<p>Коммерческое использование только с разрешения автора.<br>
При использовании необходимо явно указывать ссылку на источник.</p>

<p>Sergey Bodrov, 2010-10-24</p>

<p><b>Канал (групповой чат)</b></p>
<p>
Канал содержит:<br>
<li>Имя, начинающееся с символа "#" (решетка) и не содержащее пробелов.
<li>Описание (топик), представляющее собой строку символов.
<li>Список владельцев
<li>Список абонентов (подписчиков)
<li>Список последних сообщений
<li>"Черный список" абонентов
</p>

<p>
Запись об абоненте содержит:<br>
<li>GUID абонента
<li>состояние (подключен или отключен)
<li>ник (имя на канале, не зависит от реального имени)
<li>адрес
<li>полномочия (набор полномочий)
<li>статус (сообщение абонента)
<li>аватар (картинка)
</p>

<p>
Сообщение канала содержит:<br>
<li>дату-время
<li>имя автора
<li>GUID автора
<li>текст сообщения
</p>

<p>
Запись "черного списка" содержит:<br>
<li>GUID автора
<li>GUID абонента
<li>текст причины
<li>дату-время окончания
</p>

<p>При подключении или подписке клиента на канал, он получает описание канала, список других подключенных абонентов и список последних сообщений. Если абонент в "черном списке", то подключение не допускается.</p>

<p>При отправке клиентом сообщения на канал, сообщение направляется на узел сервиса. Сервис перенаправляет сообщение всем абонентам канала и добавляет его с список последних сообщений. Если размер списка последних сообщений превышает заданный, то самое раннее сообщение из списка удаляется.</p>

<p>При отключении абонента, его состояние в списке абонентов меняется на "отключен". При этом запись об абоненте не удаляется из списка подписчиков.</p>

<p>Любое новое сообщение или изменение в списке абонентов пересылается всем абонентам. Если абонентом является узел, то другим абонентам этого узла сообщения не передаются, это делает сам узел-подписчик.</p>


<p><b>Формат сообщений DNMP</b></p>

<p>
<u>Обязаительные реквизиты для всех сообщений</u><br>
Тип: <b>GRPC</b><br>
Параметры:<br>
<b>name</b> - название группы (канала)<br>
</p>

<p>
<u>Сообщение на канал</u><br>
Параметры:<br>
<b>author_name</b> - имя автора сообщения<br>
<b>author_guid</b> - GUID автора сообщения<br>
<b>timestamp</b> - таймштамп сообщения<br>
Данные:<br>
текст сообщения<br>
</p>

<p>
<u>Команда сервису</u><br>
Параметры:<br>
<b>cmd</b> - команда<br>
Данные:<br>
параметры команды<br>
</p>

<p>
<u>Данные</u><br>
Параметры:<br>
<b>data</b> - тип данных<br>
Данные:<br>
содержимое данных<br>
</p>

<p><b>Команды:</b></p>
[S] - Cервис на узле<br>
[C] - Клиент<br>
[SС] - Сервис на узле и клиент<br>

<p>
JOIN &lt;GUID_абонента&gt; [текст]<br>
[S] Если абонент не в "черном списке", то добавляем абонента в список подписчиков
и пользователей канала. Затем отправляем абоненту информацию о канале (тема, 
режимы), список пользователей, последние сообщения.<br>

[C] Добавляет абонента в список подписчиков и пользователей канала.<br>
</p>

<p>
LEAVE &lt;GUID_абонента&gt; [текст]<br>
[SС] Убирает абонента из списка подписчиков и пользователей канала.
</p>

<p>
SET_TOPIC &lt;текст&gt;<br>
[S] Устанавливает тему канала
</p>

<p>
GET_TOPIC<br>
[S] Возвращает сообщение, содержащее заголовок (тему) канала.
</p>

<p>
GET_USERS<br>
[S] Возвращает список активных подписчиков
</p>

<p>
GET_ABONENTS<br>
[S] Возвращает список всех подписчиков
</p>

<p>
GET_LAST_MESSAGES [число сообщений]<br>
[S] Возвращает последние сообщения
</p>

<p>
GET_MODE<br>
[S] Возвращает строку режимов канала
</p>

<p>
SET_MODE<br>
[SC] Устанавливает один или несколько режимов канала
</p>

<p>
KICK &lt;GUID_абонента&gt; [причина]<br>
[SC] Убирает абонента из списка подписчиков с указанием причины
</p>

<p>
BAN &lt;GUID_абонента&gt; &lt;срок&gt; [причина]<br>
[SC] Добавляет абонента в "черный список" на заданый срок в указанием причины.
</p>

<p>
UNBAN &lt;GUID_абонента&gt;<br>
[SC] Удаляет абонента из "черного списка".
</p>

<p>
GET_BANLIST<br>
[S] Возвращает "черный список" абонентов
</p>

<p>
SAY &lt;GUID_абонента&gt; &lt;текст&gt;<br>
[SC] Сообщение на канал от абонента
</p>

<p>
RENAME &lt;GUID_абонента&gt; &lt;новое_имя&gt;<br>
[SC] Переименование абонента
</p>

<p>
SET_STATE &lt;GUID_абонента&gt; &lt;признак_состояния&gt; [текст состояния]<br>
[SC] Установка состояния абонента
</p>




<p><b>Данные:</b></p>

<p>
TOPIC - тема канала<br>
Содержит текст темы канала
</p>

<p>
USERS - список активных подписчиков<br>
Содержит список активных подписчиков в формате CSV. Каждый элемент списка содержит сведения:<br>
<b>guid</b> - GUID абонента<br>
<b>state</b> - состояние (подключен или отключен)<br>
<b>nick</b> - ник (имя на канале, не зависит от реального имени)<br>
<b>addr</b> - адрес<br>
<b>rights</b> - полномочия (набор полномочий)<br>
<b>status</b> - статус (сообщение абонента)<br>
</p>

<p>
ABONENTS - список всех подписчиков<br>
Состав данных тот же, что и в USERS
</p>

<p>
BANLIST - список абонентов, помещенных в "черный список"<br>
<b>author_guid</b> - GUID автора<br>
<b>abonent_guid</b> - GUID абонента<br>
<b>end_date</b> - дата-время окончания<br>
<b>reason</b> - текст причины<br>
</p>

<p>
MODE - режимы канала<br>
содержит строку режимов канала
</p>

<p>
STATE - состояние абонента<br>
содержит признак состояния и текст состояния вида:<br>
&lt;GUID_абонента&gt; &lt;признак_состояния&gt; [текст состояния]<br>
Признаки состояния:<br>
ON - онлайн<br>
OFF - оффлайн<br>
AFK - онлайн, недоступен<br>
BUSY - онлайн, занят (не беспокоить)<br>
Возможны и другие варианты признака состояния.<br>
</p>

</body>
</html>